package com.neuedu.dao.Imp;

import cn.hutool.core.util.StrUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import cn.hutool.db.handler.BeanHandler;
import com.neuedu.dao.BusinessDao;
import com.neuedu.pojo.Business;
import com.neuedu.pojo.PageResult;
import com.neuedu.utils.JDBCUtil;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.*;

public class BusinessDaoImp implements BusinessDao {
    private DataSource dataSource = JDBCUtil.getDruidDataSource();


    // 商家注册
    // 添加商家信息
    @Override
    public Integer addBus(String account, String password, String telephone, String contact) throws Exception{
        return Db.use(dataSource).insert(
                Entity.create("business")
                        .set("account",account)
                        .set("password",password)
                        .set("reg_time",(new Date()))
                        .set("telephone",telephone)
                        .set("contact",contact)
        );
    }

    // 商家登录
    // 查询商家部分信息

    @Override
    public Business selectPar(String account, String password) throws Exception{
        Business business = Db.use(dataSource).query("select * from business where account = ? and password = ?", BeanHandler.create(Business.class),account,password);
        return business;
    }


    // 加载信息
    // 查询商家全部信息


    /**
     * 客户端给后端程序传递数据的时候
     * 会传递当前需要页码currentPage和每页要显示pageSize的数据行数
     * 在sql中，需要的查询的起始下标（位置）和每页显示的行数
     *
     * 分析：
     * currentPage = 1  表示查询第一页的数据   0，2
     * currentPage = 2  表示查询第一页的数据   2，2
     * currentPage = 3  表示查询第一页的数据   4，2
     * currentPage = 4  表示查询第一页的数据   6，2
     * currentPage = 5  表示查询第一页的数据   8，2
     * 起始位置与页码之间的关系：
     * （currentPage - 1） * pageSize
     * */
    @Override
    public List<Business> selectAll(String account, String telephone, String contact, String currentPage, String pageSize) throws Exception{
        String sql = "select * from business ";

        // 定义一个map集合，将搜索条件对应的列名作为map的key，搜索条件的值作为map的value
        Map<String,String> map = new HashMap<>();
        // 判断传递的参数
        if(StrUtil.isNotBlank(account)){
            map.put("account",account);
        }
        if(StrUtil.isNotBlank(telephone)){
            map.put("telephone",telephone);

        }
        if(StrUtil.isNotBlank(contact)){
            map.put("contact",contact);
        }
        // 这里可以直接判断map是否为空
        if(!map.isEmpty()){
            sql += " where ";
            // 判断成立，说明map中有搜索的条件数据，这时只要遍历map，去给sql拼接条件即可
            Set<Map.Entry<String,String>> entries = map.entrySet();
            for (Map.Entry<String, String> entry : entries) {
                sql += entry.getKey() + " like" + " '%" + entry.getValue() + "%' or ";
            }
            // sql的最后多or关键字 ，需要单独处理"select * from business where account like %?% or telephone like %?% or contact like %?% or "
            sql = sql.substring(0,sql.lastIndexOf("or"));
        }
        // "select * from business where account like %?% or telephone like %?% or contact like %?% limit 起始位置 , 条数"
        // 判断分页的参数、
        Integer page = 1;
        Integer size = 2;
        if(StrUtil.isNotBlank(currentPage)){
            page = Integer.valueOf(currentPage);
        }
        if(StrUtil.isNotBlank(pageSize)){
            size = Integer.parseInt(pageSize);
        }
        sql += " limit " + (page - 1) * size + " , " + size;



        return Db.use(dataSource).query(sql,Business.class);
    }

    // 查询business数据总条数

    @Override
    public Long selectCount() throws Exception {
        return  Db.use(dataSource).count(Entity.create("business"));
    }


    // 删除商家信息

    @Override
    public Integer delBus(String id) throws Exception{
        return Db.use(dataSource).del(
                Entity.create("business")
                        .set("id",id)
        );
    }

    // 修改商家数据

    @Override
    public Integer updateBus(String account, String password, String telephone, String contact, String id) throws Exception{
        return Db.use(dataSource).update(
                Entity.create()
                        .set("account",account)
                        .set("password",password)
                        .set("telephone",telephone)
                        .set("contact",contact),
                Entity.create("business")
                        .set("id",id)
        );
    }
}
